جزوه · فرمان sed (Stream Editor) ← بازگشت به فهرست
📘 فصل اول · قسمت هفدهم فرمان sed (Stream Editor)
📅 تاریخ: ۱۹ مرداد ۱۴۰۵ 👤 مدرس: محمد عابدینی 🐚 Zsh · 🐧 Debian

▍ مقدمه

sed مخفف Stream Editor است و یک ابزار خط فرمانی قدرتمند برای پردازش و ویرایش متن به صورت غیرتعاملی (Non-interactive) است.

🔑 ویژگی‌های اصلی:
  • ورودی را خط به خط پردازش می‌کند.
  • بدون باز کردن فایل در ویرایشگر، عملیات جستجو، جایگزینی، حذف و استخراج را انجام می‌دهد.
  • به‌طور پیش‌فرض نتیجه را به خروجی استاندارد (STDOUT) چاپ می‌کند.
  • با گزینه -i تغییرات را مستقیماً روی فایل اعمال می‌کند.

▍ ساختار کلی

sed [options] 'command' file

توضیح: گزینه‌ها، دستور sed و نام فایل ورودی.

▍ عملیات جایگزینی (Substitution)

مهم‌ترین کاربرد sed، جایگزینی متن با دستور s است.

• ساختار جایگزینی

sed 's/pattern/replacement/' file
  • s → دستور جایگزینی (Substitute)
  • pattern → الگوی جستجو
  • replacement → متن جایگزین
  • / → جداکننده (می‌تواند هر کاراکتری باشد)

• مثال‌های جایگزینی

┌──(ya3in㉿kali)-[~] └─$ sed 's/root/admin/' /etc/passwd

توضیح: اولین root در هر خط را با admin جایگزین می‌کند.

┌──(ya3in㉿kali)-[~] └─$ sed 's/bash/sh/g' /etc/passwd

توضیح: g (global) یعنی همه موارد bash را در هر خط با sh جایگزین کن.

• جداکننده‌های جایگزین

اگر الگوی شما شامل / باشد، می‌توانید از جداکننده دیگری استفاده کنید:

sed 's|/home/user|/home/admin|g' file.txt sed 's:/home/user:/home/admin:g' file.txt

▍ گزینه‌های مهم sed

گزینه توضیح مثال
-i ویرایش درون‌مکانی (In-Place) و اعمال تغییرات مستقیم روی فایل sed -i 's/old/new/g' file.txt
-i.bak ویرایش درون‌مکانی با ایجاد پشتیبان (با پسوند .bak) sed -i.bak 's/old/new/g' file.txt
-n خاموش کردن چاپ خودکار (فقط با p چاپ می‌کند) sed -n 's/old/new/p' file.txt
-e اجرای چندین دستور sed sed -e 's/old/new/' -e 's/foo/bar/' file.txt
-f اجرای دستورات از یک فایل اسکریپت sed -f script.sed file.txt
-r یا -E استفاده از عبارات با قاعده توسعه‌یافته (ERE) sed -r 's/[0-9]+/NUM/g' file.txt

▍ عملیات حذف (Delete)

با دستور d می‌توانید خطوط را حذف کنید.

┌──(ya3in㉿kali)-[~] └─$ sed '3d' file.txt

حذف خط سوم فایل.

┌──(ya3in㉿kali)-[~] └─$ sed '2,5d' file.txt

حذف خطوط ۲ تا ۵.

┌──(ya3in㉿kali)-[~] └─$ sed '/pattern/d' file.txt

حذف خطوطی که شامل pattern هستند.

┌──(ya3in㉿kali)-[~] └─$ sed '/^$/d' file.txt

حذف خطوط خالی (^$ یعنی ابتدا و انتهای خط بدون هیچ کاراکتری).

▍ عملیات نمایش (Print)

با دستور p و گزینه -n می‌توانید خطوط خاصی را نمایش دهید.

┌──(ya3in㉿kali)-[~] └─$ sed -n '3p' file.txt

نمایش فقط خط سوم.

┌──(ya3in㉿kali)-[~] └─$ sed -n '2,5p' file.txt

نمایش خطوط ۲ تا ۵.

┌──(ya3in㉿kali)-[~] └─$ sed -n '/error/p' /var/log/syslog

نمایش فقط خطوطی که شامل error هستند.

▍ عملیات جایگزینی با آدرس (Addressing)

می‌توانید عملیات را روی خطوط خاص اعمال کنید.

┌──(ya3in㉿kali)-[~] └─$ sed '3s/old/new/' file.txt

فقط در خط سوم جایگزینی انجام بده.

┌──(ya3in㉿kali)-[~] └─$ sed '2,5s/old/new/g' file.txt

در خطوط ۲ تا ۵ همه موارد old را با new جایگزین کن.

┌──(ya3in㉿kali)-[~] └─$ sed '/pattern/s/old/new/g' file.txt

در خطوطی که شامل pattern هستند، جایگزینی انجام بده.

▍ ویرایش درون‌مکانی (In-Place) با -i

⚠️ مهم:

بدون -i، sed فقط خروجی را در ترمینال نشان می‌دهد و فایل اصلی تغییری نمی‌کند. با -i تغییرات مستقیماً روی فایل اعمال می‌شود.

┌──(ya3in㉿kali)-[~] └─$ sed -i 's/PermitRootLogin no/PermitRootLogin yes/' /etc/ssh/sshd_config

توضیح: به‌روزرسانی فایل sshd_config برای اجازه دادن به ورود روت.

┌──(ya3in㉿kali)-[~] └─$ sed -i.bak 's/old/new/g' file.txt

توضیح: قبل از اعمال تغییرات، یک پشتیبان از فایل با پسوند .bak ایجاد می‌کند.

▍ استفاده از متغیرها و shell

می‌توانید از متغیرهای Bash در sed استفاده کنید:

┌──(ya3in㉿kali)-[~] └─$ old="root" └─$ new="admin" └─$ sed "s/$old/$new/g" /etc/passwd

توجه: استفاده از دونقل قول (") به جای یونقل قول (') برای جایگزینی متغیرها.

▍ جدول خلاصه دستورات

دستور کاربرد
sed 's/old/new/' file جایگزینی اولین old در هر خط
sed 's/old/new/g' file جایگزینی همه موارد old در هر خط
sed '3d' file حذف خط سوم
sed '2,5d' file حذف خطوط ۲ تا ۵
sed '/pattern/d' file حذف خطوط حاوی pattern
sed -n '3p' file نمایش فقط خط سوم
sed -n '/pattern/p' file نمایش خطوط حاوی pattern
sed -i 's/old/new/g' file ویرایش مستقیم فایل
sed -i.bak 's/old/new/g' file ویرایش با ایجاد پشتیبان
sed -e 's/old/new/' -e 's/foo/bar/' file اجرای چندین دستور
sed -f script.sed file اجرای دستورات از فایل اسکریپت
sed '3s/old/new/' file جایگزینی فقط در خط سوم

▍ مثال‌های پیشرفته

┌──(ya3in㉿kali)-[~] └─$ sed 's/^[ \t]*//' file.txt

توضیح: حذف فاصله‌های ابتدای هر خط (Trim leading whitespace).

┌──(ya3in㉿kali)-[~] └─$ sed 's/[ \t]*$//' file.txt

توضیح: حذف فاصله‌های انتهای هر خط (Trim trailing whitespace).

┌──(ya3in㉿kali)-[~] └─$ sed 's/\(.*\)/\U\1/' file.txt

توضیح: تبدیل همه حروف به بزرگ (Uppercase).

┌──(ya3in㉿kali)-[~] └─$ sed 's/\(.*\)/\L\1/' file.txt

توضیح: تبدیل همه حروف به کوچک (Lowercase).

✅ تمرین پیشنهادی:
  • یک فایل متنی بسازید و با sed 's/old/new/' جایگزینی را امتحان کنید.
  • با sed -n '/pattern/p' خطوط خاصی را نمایش دهید.
  • خطوط خالی یک فایل را با sed '/^$/d' حذف کنید.
  • با sed -i.bak یک فایل را ویرایش کنید و پشتیبان آن را بررسی کنید.
  • با sed -e دو دستور جایگزینی را همزمان اجرا کنید.